<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/6/16
  Time: 16:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2 class="heading" data-id="heading-0"
    style="margin-top: 10px; margin-bottom: 10px; font-size: 20px; font-weight: bold; line-height: 1.5; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif;">
    1. Java并发这块掌握的怎么样？来谈谈你对volatile关键字的理解吧。</h2>
<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    参考答案：</p>
<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    我的理解是，被volatile修饰的共享变量，就会具有以下两个特性：</p>
<ol style="padding-left: 40px; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    <li style="list-style-type: decimal;">保证了不同线程对该变量操作的内存可见性。</li>
    <li style="list-style-type: decimal;">禁止指令重排序。</li>
</ol>
<h2 class="heading" data-id="heading-1"
    style="margin-top: 10px; margin-bottom: 10px; font-size: 20px; font-weight: bold; line-height: 1.5; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif;">
    2. 那你可不可以详细的说一下究竟什么是内存可见性，什么又是重排序？</h2>
<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    参考答案：</p>
<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    这个要是说起来可就多了，我就从Java内存模型开始说起吧。Java虚拟机规范试图定义一个Java内存模型(JMM)，以屏蔽所有类型的硬件和操作系统内存访问差异，让Java程序在不同的平台上能够达到一致的内存访问效果。简单地说，由于CPU执行指令的速度很快，但是内存访问速度很慢，差异不是一个量级，所以搞处理器的那群大佬们又在CPU里加了好几层高速缓存。</p>
<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    在Java内存模型中，对上述优化进行了一波抽象。JMM规定所有的变量都在主内存中，类似于上面提到的普通内存，每个线程又包含自己的工作内存，为了便于理解可以看成CPU上的寄存器或者高速缓存。因此，线程的操作都是以工作内存为主，它们只能访问自己的工作内存，并且在工作之前和之后，该值被同步回主内存。</p>
<p style="margin: 10px auto; color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;">
    说的我自己都有点晕了，用一张图来帮助我们理解吧：</p>
</body>
</html>
